package cn.itcast.zt.config;

import cn.itcast.zt.domain.User;
import cn.itcast.zt.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.server.RequestPredicates;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Flux;

import java.util.Collection;

/**
 * 路由器函数  配置
 * create by zhangtian on 2018/3/6
 */
@Configuration
public class RouterFunctionConfiguration {

    /**
     * Servlet
     * 请求接口：ServletRequest 或者 HttpServletRequest
     * 相应接口：ServletResponse 或者 HttpServletResponse
     *
     * Spring5.0 重新定义了服务请求和相应接口
     * 请求接口：ServerRequest
     * 响应接口：ServerResponse
     * 既可以支持Servlet规范，也可以支持自定义  比如：Netty（Web Server）
     * 以本地定义一个GET请求，并返回所有用户对象  URI:/persons/findAll
     * Flux是0..N个对象集合
     * Mono是0..1个对象集合
     * Reactive中的Flux或者Mono是异步处理(非阻塞)
     * 之前的集合对象基本上是同步处理（阻塞）
     * Flux或者Mono都是Publisher
     */
    @Bean
    @Autowired
    public RouterFunction<ServerResponse> personsFindAll(UserRepository userRepository) {
        // 返回所有用户对象
        return RouterFunctions.route(RequestPredicates.GET("/persons/findAll"),
                request ->{
                    Collection<User> users = userRepository.findAllPersons();
                    Flux<User> userFlux = Flux.fromIterable(users) ;
                    return ServerResponse.ok().body(userFlux, User.class) ;
                }) ;
    }
}
